perm filename LOADR.FAI[PUR,LCS] blob sn#461054 filedate 1979-07-23 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00012 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		.INSERT	ASMBL.FAI
C00004 00003	PTR
C00005 00004	 EROM #2
C00007 00005	 PT READER
C00008 00006	 PTR INTERUPT ROUTINE
C00009 00007
C00010 00008	LINE EDIT
C00013 00009	 PROM ADDR = 177400
C00015 00010		SETAD:	STYZ	DADR	AND DADR		2
C00017 00011	 GET VAL
C00019 00012	 LED OUT
C00030 ENDMK
C⊗;
	.INSERT	ASMBL.FAI
; RAM
	SVPCH:	377	;0
	SVPCL:	377	;1
	SVPS:	377	;2
	SVA:	176	;3

	SVX:	176	;4
	SVY:	377	;5
	SVSP:	377	;6
	SVNMI:	377	;7

	SVPRA:	377	;10
	SVCRA:	377	;11
	SVPRB:	377	;12
	SVCRB:	377	;13

	DADR:	377	;14
		377	;15
	VAL:	377	;16
	NFLG:	377	;17
	ADR:	377	;20
		377	;21
		377	;22  ← FF MARK

; ODT RAM & INTERUPT VECTORS
	LOC 1000

	IRQA:	REPEAT 3,{111↔}	;1000 - 1002
	IRQB:	REPEAT 2,{111↔}	;1003 - 1004
	
	NMIA:	REPEAT 3,{333↔}	;1005 - 1007
		377		;1010 ← FF MARK

; SUBS
;		BRKIN← 177400	←377   0
;		ODT  ← 177415	←377  15
;		LDPY ← 177704	←377 304
;		IKBW ← 177754	←377 354
;PTR
	LOC 1400

;SETUP VECTOR
		LDAI	114
		STA	IRQA
		LDAI	PTI
		STA	IRQA+1
		LDAI	PTI⊗-10∧377
		STA	IRQA+2
;SETUP PTR
		LDXI	0
		STXZ	DONE
		LDAI	67
		STA	CRA
		LDAI	57
		STA	CRB
		BNE	376

;PTRI VECTOR
   ;POLL PTRI
	PTI:	BIT	CRB
		BMI	RBYTE
		JMP	ODT
   ;CK START
	RBYTE:	LDA	PRA
		BITZ	DONE
		BNE	SBYTE
		LDA	PRA
		BEQ	LEADR
		STAZ	DONE
		BNE	LEADR

;READ BYTE
	SBYTE:	LDA	PRA
		STAZX	FF
		INX
		BNE	LEADR
		JMP	ODT
	LEADR:	BIT	PRB
		RTI

; EROM #2
	LOC 1400
		JSR	ESCAN	;SETUP RETURN		3
??		JMP		;RETURN TO MON ROM	3

; DATA TABLES
	PTBL:	114		;JMP			1
		0		;DD REG			1
		7		;KB INTERUPT		1
		377		;DD REG			1
		54		;LED LATCH		1
	
	JTBL:	15		;ODT ADDR LOW		1
		377		;ODT ADDR HI		1

; STANDARD SETUP
	SETUP:	LDAI	3	;			2
		STAZ	0	;SETUP START ADDR	2
		LDAI	0	;			2
		STAZ	1	;			2
		STAZ	2	;SETUP PS		2

		LDXI	4	;			2
	SETL:	LDAX	PTBL	;SETUP NMI JMP		3
		STAZX	7	;& PIA REGS		2
		DEX		;			1
		BPL	SETL	;			2

		STA	IRQV	;SETUP IRQV JMP		3
	JLOP:	INX		;			1
		LDAX	JTBL	;SETUP IRQV & NMIV	3
		STAX	IRQV+1	;TO JMP TO ODT		3
		STAX	NMIV+1	;			3
		BPL	JLOP	;MORE IF NOT 377	2
		RTS		;RETURN		      __1_
				;		       49
; PT READER
	SETRG:	LDA	CRB	;GET OLD CREGB		3
		PHA		;SAVE IT		1
		ORI	6	;SET FLG & DD BITS	2
		ANDI	376	;RESET INTERUPT BIT	2
		STA	CRB	;			3

		LDA	CRA	;GET OLD CREGA		3
		PHA		;SAVE IT		1
		ORAI	64	;SET DD & LIGHT BITS	2
		ANDI	367	;LIGHT BIT		2
		STA	CRA	;		      __3_
				;		       22

TSTFLG:	BIT	CRB		;TEST PTR FLG
	BPL	TSTFLG
	LDA	PRB		;RESET FLG
	LDA	PRA		;CHECK FOR FIRST
	BEQ	TSTFLG		;NON ZERO INPUT

	JSR	PUTIN		;LOAD IT

	LDA	7
	STA	CRA		;FIX CRA FOR INPUT INTERUPT
	CLI
??	BNE	.		;WAIT FOR INPUT
; PTR INTERUPT ROUTINE
	PTST:	BIT	CRB	;TEST PTR FLG		3
		BMI	PTRI	;YES LOAD IT		2
		JMP	OIRQ	;NO GO TO OLD VECTOR	3

	PTRI:	PHA		;SAVE AC		1
		TXA		;SAVE X			1
		PHA		;			1

		LDA	PRA	;LOAD BYTE		3
		BIT	PRB	;RESET IFLG		3
		CLI		;CLEAR IBIT		1

		LDXI	0	;NO INDEX		2
		STAIX	ADR	;STORE IT @ADR		2
		INCZ	ADR	;LOW←LOW+1		2
		BNE	NOINC	;			2
		INCZ	ADR+1	;HI←HI+1		2

	NOINC:	PLA		;GET X			1
		TAX		;			1
		PLA		;GET A			1
		RTI		;RETURN		      __1_
				;		       32

;8 BIT RANDOM NUM GEN SUB: A ← (RAND (A))

	RAND:	ORAI	0
		BNE	NOT0
		LADI	1
	NOT0:	PHA
		ANDI	216	;S.R. MASK. 102000 ∨ LB:0,HB:204 FOR 16 BIT.
		BEQ	SKIP
	SHIFT:	ASLA
		BCC	SHIFT
		BEQ	EXOR
	SKIP:	CLC
	EXOR:	PLA
		ROLA
		RTS		;RETURN WITH RAND IN A.
	
;LINE EDIT

;INTERUPT KB INPUT ROUTINE

KBIND ← 173370  ↔  KBCR ← 173371	;KB IN PORT
KBUFA ← 22	;KB LAST CHR POINTER (LAST IN +1)
KBUFB ← 22	;KB NEXT CHR POINTER (LAST READ)
KBFLG ← 24	;KB INPUT FLAG

	CKKBF:	BIT	KBCR	;CHECK KB FLAG BIT
		BMI	GETCHR
		RTS
	GETCHR:	PHA
		TXA
		PHA

		LDXI	200
	WAIT:	INX		;FLUSH WHEN KB IS DEBOUNCED
		BNE	WAIT

		LDA	KBIND	;GET CHR FROM KB
		STAIX	KBUFA	;MAKE SURE X IS 0 AND PUT IN KB BUF
		INCZ	KBUFA	;POINTS TO END OF INPUT
		LDAZ	KBUFA
		ANDI	77	;FOR WRAP AROUND
		LDXI	200	;SET KBIN FLAG
		CPMZ	KBUFB	;CHECK IF FULL
		BNE	SAVIT
		LDXI	300	;SET ERROR FLG
		
	SAVIT:	STAZ	KBUFA
		TXA
		ORAZ	KBFLG
		STAZ	KBFLG	;SET KB IN FLAG
		PLA
		TAX
		PLA
		RTI		;RETURN


	DPYKB:	JSR	INCHRW
		BPL	NBUCKY
		JMP	BUCH↓h	
	NBUCKY:	CMPI	
		BEQ	CALL	;CALL
		CMPI	15
		BEQ	CRLF	;CRLF
		CMPI	
		BEQ	BS	;BACK SPACE
		CMPI	
		BEQ	TAB	;TAB
		CMPI	

	NOBUK:	STAIX	TEXTA	;STORE IN DPY MEM

		INCZ	TEXTA
		BNE	NPBC
		INCZ	TEXTA+1
		LDAZ	TEXTA+1
		STA	DPYCUR+1
	NPBC:	LDAZ	TEXTA	;FIX CURSOR
		STA	DPYCUR

		RTS


	BUCKY:	BEQ	CSP	;CONTROL SPACE
		CMPI	
		BEQ	CBS	;CONTROL BACK SPACE
		CMPI	
		BEQ	CTAB	;CONTROL TAB
		CMPI	
		BEQ	CUP	;CONTROL UP CUR
		CMPI	
		BEQ	CDOWN	;CONTROL DOWN CUR
		JMP	NOBUK

	INCHRW:	BITZ	KBFLG	;WAIT UNTIL CHR
		BPL	INCHRW

		INCZ	KBUFB	;POINT TO LAST READ
		LDAZ	KBUFB
		ORAI	77
		STAZ	KBUFB

		BITZ	KBFLG
		BVS	INERR	;BUF FULL GO TO ERROR

		LDXI	0
		LDAIX	KBUFA	;GET CHR AND RETURN
		RTS

; PROM ADDR = 177400
	SVNUM←17   ↔	BBIT←20
	LOC 177400		;SHOULD BE 177400

; BRK FLG CHECK
	BRKCK:	STAZ	SVA	;SAVE A 		2
		PLA		;GET OLD PS		1
		PHA		;			1
		ANDI	BBIT	;			2
		BNE	BRKIN	;AND CK FOR BRK		2
		LDAZ	SVA	;			2
		JMPIN	IRQB	;ELSE RETURN TO IRQV  __3_
				;		       13
; PROM RESET &	OCT DDT
	ODT:	STAZ	SVA	;SAVE A			2
	BRKIN:	LDA	NMIA	;			3
		STA	SVNMI	;SAVE NMIA		3
		LDAI	RTI	;			2
		STA	NMIA	;FIX IT			3
		STXZ	SVX	;SAVE X		      __2_
				;		       15

; RESET I/O		SAVE PR ?
	CRA←173775  ↔	PRA←173774
	CRB←173777  ↔	PRB←173776

		LDXI	3	;			2
	SVPIA:	LDAX	PRA	;SAVE CR THEN DD	3
		STAZX	SVPRA	;			2
		LDAI	0	;			2
		STAX	PRA	;REPLACE WITH ZEROS	3
		DEX		;			1
		BPL	SVPIA	;			2

		STX	PRB	;FOR OUTPUT	      __3_
				;		       18
; DPY .LOC
		STYZ	SVY	;SAVE Y			2
		PLA		;			1
		STAZ	SVPS	;SAVE PS AND PC		2
		PLA		;			1
		STAZ	SVPCL	;			2
		TAY		;LOAD Y WITH PCL	1
		PLA		;			1
		STAZ	SVPCH	;			2
		TSX		;			1
		STXZ	SVSP	;SAVE SP		2
		TAX		;LOAD X WITH PCH      __1_
				;		       16
				;		      ____
				;		       62
	SETAD:	STYZ	DADR	;AND DADR		2
		STXZ	DADR+1	;			2
	GVAL:	STYZ	ADR	;SETUP ADR		2
		STXZ	ADR+1	;			2
		LDXI	0	;			2
		LDAIX	DADR	;GET VAL FROM @DADR	2
		STAZ	VAL	;		      __2_
				;		       14
; KB SCAN
	KSCAN:	JSR	LDPY	;DPY DADR AND VAL	3
		JSR	IKBW	;GET KBCHR		3
		ANDI	17	;GET RID OF JUNK	2
		CMPI	10	;			2
		BEQ	DOT	;EXAM			2
		LDXZ	NFLG	;			2
		BCC	GNUM	;BRANCH ON NUM		2
		BPL	XNXT	;IF NO DEP THEN EX NXT__2_
				;		       18
; DEP
		LDAZ	DADR	;DEP DREG LOW 		2
		INX		;X ← 0			1
		STAIX	ADR	;IN @ADR		2
; EXAM NEXT
	XNXT:	LDXI	2	;	 		2
		STXZ	NFLG	;			2
		LDYZ	ADR	;			2
		LDXZ	ADR+1	;			2
		INY		;ADR ← ADR+1		1
		BNE	SETAD	;			2
		INX		;			1
		JMP	SETAD	;		      __3_
				;		       20
; EXAM
	ER1←177000
	DOT:	LDXZ	NFLG	;CK FOR NO NUM		2
		BPL	CKOR	;			2
		INX		;			1
		STXZ	NFLG	;			2
		LDYZ	DADR	;GET DADR FOR ADR	2
		LDXZ	DADR+1	;			2
		JMP	GVAL	;		      __3_
				;		       14

	CKOR:	BNE	CONT	;CK FOR CONTINUE	2
		LDX	ER1	;			3
		INX		;			1
		BEQ	KSCAN	;CK FOR OTHER PROM	2
		JMP	ER1	;		      __3_
				;		       11
				;		      ____
				;		       77
; GET VAL
	GNUM:	BMI	NOZRO	;IF FIRST NUM		2
		LDXI	0	;			2
		STXZ	DADR	;THEN ZERO ADR DPY	2
		STXZ	DADR+1	;			2
	NOZRO:	LDXI	2	;			2
	DIG:	ASLZ	DADR	;SHIFT ADDRESS LEFT	2
		ROLZ	DADR+1	;			2
		DEX		;			1
		BPL	DIG	;SHIFT MORE		2
		ORAZ	DADR	;AND ADD KBCHR		2
		STAZ	DADR	;			2
		STXZ	NFLG	;SE FLG		2
		JMP	KSCAN	;		      __3_
				;		       26
; CONTINUE
	CONT:	LDAZX	SVCRA	;RESTORE CRB AND CRA	2
		STAX	CRA	;			3
		DEX		;			1
		DEX		;			1
		BPL	CONT	;		      __2_
				;			9

		LDXZ	SVSP	;GET SP			2
		TXS		;			1
		LDYZ	SVY	;GET Y			2

		LDXI	-4	;			2
	GETS:	LDAZX	SVPCH+4	;RESTORE PC AND PS 	2
		PHA		;TO STACK		1
		INX		;			1
		BMI	GETS	;		      __2_
				;		       13

		PLA		;GET A			1
		LDXZ	SVNMI	;			2
		STX	NMIA	;RESTORE NMIV		3
		LDXZ	SVX	;GET X			2
		RTI		;		      __1_
				;			9
				;		      ____
				;		       57
; LED OUT
	LDPY:	LDAI	54	;SET DDBIT		2
		STA	CRB	;AND PULSE IN CRB	3

		LDXI	5	;			2
		LDYI	5	;		       _2_
				;			9

	ROT:	ROLZ	VAL	;ROTATE VAL AND		2
		ROLZ	DADR	;DADR LEFT 4	 	2
		ROLZ	DADR+1	;BITS AT A TIME		2
		DEY		;			1
		BNE	ROT	;		       _2_
				;			9

		LDAZ	VAL	;			2
		ANDI	17	;			2
		ORAX	DTBL	;			3
		STA	PRB	;DPY IT			3
		LDYI	4	;			2
		DEX		;			1
		BPL	ROT	;DO REST		2
		RTS		;		      __1_
				;		       16

	DTBL:	0		;			1
		20		;			1
		40		;			1
		60		;			1
		100		;			1
		120		;		      __1_
				;			6
; INKBW
	IKBW:	LDAI	6	;SET DDBIT		2
		STA	CRA	;AND ↑BIT IN CRA	3
	CKMOR:	BIT	CRA	;TEST CRA FOR INPUT	3
		BPL	CKMOR	;TRY AGAIN		2
		LDA	PRA	;GET CHR		3
		RTS		;RETURN		      __1_
				;		       14
; ROM INTER VECTS
	LOC 177772
	NMIV:	ABSO NMIA	;			2
	RSTV:	ABSO ODT	;			2
	IRQV:	ABSO IRQA	;		       _2_
				;			6
				;		      ____
				;		       60

				;		       62
				;		       77
				;		       57
				;		     __60_
END				;		      256